package utils

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"zinx/Zinx/ziface"
)

// 存储Zinx的全局参数, 供其他模块使用, 部分参数读取用户配置zinx.json
type GlobalConfig struct {
	// Server
	TcpServer ziface.IServer // 当前zinx全局的Server对象
	Host      string         // 当前Server监听的IP
	TcpPort   int            // 当前Server监听的端口
	Name      string         // 当前Server名称
	// Zinx
	Version         string // 当前Zinx版本号
	MaxConn         int    // 当前Server允许的最大连接数
	MaxPackageSize  uint32 // 当前Zinx允许数据包容量的最大值
	WorkerPoolSize  uint32 // 当前Zinx工作池Worker数量(即消息队列数量)
	MaxTaskQueueLen uint32 // 当前Zinx工作池消息队列容量
}

// 定义一个全局暴露的GlobalConfig
var Global *GlobalConfig

// 加载zinx.json到GlobalConfig中
func (g *GlobalConfig) Reload() {
	data, err := ioutil.ReadFile("conf/zinx.json")
	if err != nil {
		panic(fmt.Sprintln("[zinx.json Reload ReadFile]err:", err))
	}
	err = json.Unmarshal(data, &Global)
	if err != nil {
		panic(fmt.Sprintln("[zinx.json Reload Unmarshal]err:", err))
	}
}

// init 导包时自动执行
// 初始化GlobalConfig
func init() {
	// 默认配置
	Global = &GlobalConfig{
		Name:            "ZinxServerApp",
		Host:            "0.0.0.0",
		TcpPort:         8999,
		Version:         "v1.0",
		MaxConn:         100,
		MaxPackageSize:  4096,
		WorkerPoolSize:  10,
		MaxTaskQueueLen: 1024,
	}
	Global.Reload()
}
